/***********************************************************************************************//**
*\n  @file       device_uart.hpp
*\n  @brief      RS232/RS485设备类
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n       1. RS232/RS485设备类
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01   罗先能        2021.5.12          创建
*\n
***************************************************************************************************/
#pragma once
#ifndef H_846F3F55_754E_4C6E_943F_1F8F866040F4_
#define H_846F3F55_754E_4C6E_943F_1F8F866040F4_

/**************************************************************************************************
* 头文件
***************************************************************************************************/
#include "device.hpp"

/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/
#ifdef  __cplusplus //-- C only -----------------------------------------------------------
extern "C" {
#endif

// uart设备节点
#define PS_UART0     "/dev/ttyPS0"
#define PS_UART1     "/dev/ttyPS1"

#define SPI_UART0    "/dev/spi2uart0"
#define SPI_UART1    "/dev/spi2uart1"

// Ioctl()命令
#define CMD_CLEAN_RX_BUFFER				(0)					// 清除buffer数据


// uart配置参数
typedef struct TRs232Handle
{
	// (已经支持):
	int iBandrate;  	// 波特率(单位 bps)
	int iStopBit;   	// 停止位 1==1bit, 2==2bit(or 1.5bit)

	int iParity;    	// 奇偶校验位 0==none, 1==odd奇校验,2==even偶校验;
	int iFlowControl; 	// 流控 0==none, 1==Xon/Xoff, 2==RTS/CTS;
	int iDataBits;  	// 数据byte长 8==8bit(默认值),7==7bit,6==6bit,5==5bit;
	int iFifoMode;      // rx接收FIFO的方式,0==FIFO满不收,1==覆盖之前的数据;

} TRs232Handle;

#ifdef  __cplusplus //--C end -------------------------------------------------------------
}
#endif

/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有函数声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/

#ifdef  __cplusplus //-- C++ only ---------------------------------------------------------

/*************************************************************************************//**
*\n 类名称： TRs232FromSpi()
*\n 功能描述：
*\n      1. spi2Rs232类,通过外接spi接口芯片(sc16is752)转RS232操作
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:     修改人:       修改日期:          描述:
*\n  V0.01   罗先能        2021.5.12       创建
*****************************************************************************************/
class TRs232FromSpi : public TDevice
{

// -- 增加 ----
private:
	// 静态函数/数据
	static int iReference;
	static TRs232FromSpi *tSelf[2];             ///< 实例指针
	///< GPIO静态参数定义
	static int		gpioFd; 					///< gpio Fd
	static TDevice* pIfGpio;					///< 指向gpio实例
	static TBus*	pIfSpi; 					///< 指向spi实例
	static pthread_t iTid;						///< 中断线程tid
	static void* GpioInterruptTask(void *arg);	///< gpio中断线程（接收线程）

	///< Tx
	static pthread_t iTxTid;					///< tx发送线程tid
	static void* TxInterruptTask(void *arg);	///< tx发送线程
	static sem_t  semTx;

private:
	#define  MAX_SIZE_FIFO  (2*1024)
	// gpio中断线程中使用
	int    mFd;                                 ///< 文件描述符
	void   IrqRead(int channel);                ///< 接收函数(中断中使用)
	char   mRxIrqBuffer[128];                   ///< 接收buffer
	long   mRxSize;                             ///< 接收到的长度

	// Rx FIFO
	int    mFifoMode;                           ///< 接收Bufer模式,0:bufer满停止接收;1:覆盖旧数据;
	char   mFifoBuffer[MAX_SIZE_FIFO];          ///< 接收FIFO缓冲
	long   mFifoSize;                           ///< 接收FIFO数据长度;
	long   mFifoIndex;                          ///< 接收FIFO index;
    char  *mpFifoTop;                           ///< fifo头
    char  *mpFifoBottom;                        ///< fifo尾

	// Tx FIFO
	int   IrqWrite(void *pBuf, long iSizeToWrite);    ///< 发送函数(中断中使用)
	char   mTxFifoBuffer[MAX_SIZE_FIFO];        ///< 发送FIFO缓冲
    char  *mpTxFifoTop;                         ///< 发送fifo头
	volatile long mTxFifoSize;                  ///< 发送FIFO数据长度;
	//long   mTxFifoIndex;                        ///< 发送FIFO index;
	volatile int   iEnableSend;                 ///< 发送控制

	sem_t  semRx;

public:
	TRs232FromSpi(const char *name, TDevice *pGpio, TBus *pSpi,
				  u32 index /* 0: spi2uart0, 1: spi2uart1 */ );
	virtual ~TRs232FromSpi();


// -- 继承于基类 ----
public:
//	TDevice();
//	TDevice(const char name[], TBus *bus=NULL);
//	virtual ~TDevice();

public:
//	virtual int Init() 												override;
	virtual int Open(void *pHandle) 								override;
	virtual int Close(void *pHandle) 								override;
//	virtual int Lock() 												override;
//	virtual int Unlock() 											override;
	virtual int Read(long address, void *pBuf, long iSizeToRead) 	override;
	virtual int Write(long address, void *pBuf, long iSizeToWrite)	override;
	virtual int Ioctl(long cmd, void *pBuf, long *pSize) 			override;

protected:
//	 char Name[32];			// 实例名称
//	 TBus *pBus;				// bus总线
//	 pthread_rwlock_t mLock;	// 锁

};


/*************************************************************************************//**
*\n 类名称： TRs232()
*\n 功能描述：
*\n            通过CPU的UART转RS232/RS422/RS485外部设备
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.5.18     创建
*****************************************************************************************/

class TRs232 : public TDevice
{
// -- 增加 ----
public:
	int         mFd;
	const char *mpPath;

public:
	TRs232(const char *name, const char *pDevicePath);
	virtual ~TRs232();

private:
	int SetParity(int iParity);
	int SetStopbit(int iStopBit);
	int SetDataBit(int iDataBits);
	int SetBandrate(int iBandrate);
	int SetFlowControl(int iFlowControl);
	int SetMode(int iBandrate, int iStopBit, int iParity, int iDataBits, int iFlowControl);


// -- 继承于基类 ----
//public:
//	TDevice();
//	TDevice(const char name[], TBus *bus=NULL);
//	virtual ~TDevice();

public:
//	virtual int Init () 											override;
	virtual int Open (void *pHandle) 								override;
	virtual int Close(void *pHandle) 								override;
//	virtual int Lock  () 											override;
//	virtual int Unlock() 											override;
//	virtual int Ioctl(long cmd, void *pBuf, long *pSize)			override;
	virtual int Read (long address, void *pBuf, long iSizeToRead) 	override;
	virtual int Write(long address, void *pBuf, long iSizeToWrite)	override;

protected:
//	char  mName[64];		 ///< 实例名称
//	TBus *pBus; 			 ///< bus总线
//	pthread_rwlock_t mLock;  ///< 锁

};

#endif //-- C++ end -------------------------------------------------------------------

#endif // H_846F3F55_754E_4C6E_943F_1F8F866040F4_

